package kr.hkit.powerjava.algorithm;

import java.util.Arrays;

public class Stack implements Structure{
	private int size = 10;//배열의 size(생성자에서 지정하지 않는다면 기본 10)
	private int top = -1;//제일 나중에 들어온 데이터의 위치
	private String[] arrStack;
		
	public Stack() {
		arrStack = new String[size];
	}

	public Stack(int size) {
		this.size = size;
		arrStack = new String[size];
	}
	
	public void push(String item){
		if(isFull()){//배열이 가득찼음을 의미(더이상 데이터를 받을 수 없음)
			System.out.println("Stack is Full");
		}else{//추가 가능한 상태
			arrStack[++top] = item;
			//제일 나중에 들어온 데이터의 위치를 top이 알려주고 있으므로 새로운 것을 넣기위해서는
			//top을 먼저 증가시킨 후에 연산을 하여야 하므로 ++top
		}
	}
	
	
	public void pop(){
		if(isEmpty()){//배열이 비었음을 의미(삭제할 데이터가 없음)
			System.out.println("Stack is Empty");
		}else{
			System.out.println(arrStack[top--] + "을 삭제합니다.");
			//삭제하기 전 top이 가리키고 있는 곳의 데이터를 보여주고 삭제하므로
			//top을 감소시키기 전에 출력문을 먼저 실행해야하므로 top--
			//실제로 삭제된 것은 아니지만 top이 데이터의 포인터이므로 쓰레기값으로 간주한다
		}
	}
		
	public boolean isEmpty(){
		return top < 0;//top이 음수이면 스택은 빈 것이다
	}
	
	public boolean isFull(){
		return top >= size-1; //size-1이 마지막 인덱스 이므로 같다고 해도 되지만
							//혹시나 모를 오류를 줄이기 위해서 크거나 같다고 설정
	}
	
	public void prnArr(){
		System.out.print("{ ");
		for (int i = 0; i <= top; i++) {
			System.out.print(arrStack[i] + " ");
		}
		System.out.println("}");
	}

	@Override
	public String toString() {//이것으로 보면 pop을 하여도 실제로 삭제되지 않았음을 알 수 있다
		return String.format("Stack [arrStack=%s]", Arrays.toString(arrStack));
	}
}
